---
title: Client Side Hydration
desc: (@quasar/app-webpack) What hydration is and its caveats in a Quasar server-side rendered app.
---
Hydration refers to the client-side process during which Vue takes over the static HTML sent by the server and turns it into dynamic DOM that can react to client-side data changes.

Since the server has already rendered the markup, we obviously do not want to throw that away and re-create all the DOM elements. Instead, we want to "hydrate" the static markup and make it interactive.

::: warning
In development mode, Vue will assert the client-side generated virtual DOM tree matches the DOM structure rendered from the server. If there is a mismatch, it will bail hydration, discard existing DOM and render from scratch. **In production mode, this assertion is disabled for maximum performance.**
:::

## Hydration Caveats
One thing to be aware of when using SSR + client hydration is some special HTML structures that may be altered by the browser. For example, when you write this in a Vue template:

```html
<table>
  <tr><td>hi</td></tr>
</table>
```

The browser will automatically inject `<tbody>` inside `<table>`, however, the virtual DOM generated by Vue does not contain `<tbody>`, so it will cause a mismatch. To ensure correct matching, make sure to write valid HTML in your templates.

## Handling Hydration Errors

If you do receive hydration errors (as seen in console: "Vuejs Error - The client-side rendered virtual DOM tree is not matching server-rendered content"), you can try following these steps:
1. Show DevTools in Chrome (F12)
2. Load the page that causes "the client-side rendered virtual DOM tree..." warning.
3. Scroll to the warning in DevTools console.
4. Click at the source location hyperlink of the warning in vue.runtime.esm.js.
5. Set a breakpoint there (left-clicking at line number in the source code browser).
6. Make the same warning appear again. Usually by reloading the page. If there are many warnings, you can check the message by moving a mouse over `msg` variable.
7. When you have found your message and stopped on a breakpoint, look at the _call stack_. Click one frame down to call to "patch" to open its source. Hover mouse over hydrate function call 4 lines above the execution line in patch. Hyperlink to the source of hydrate would open.
8. In the hydrate function, move about 15 lines from the start and set a breakpoint where false is returned after `assertNodeMatch` returned `false`. Set the breakpoint there and remove all other breakpoints.
9. Make the same warning happen again. Now, when breakpoint is hit, execution should stop in the hydrate function. Switch to DevTools console and evaluate `elm` and then `vnode`. Here `elm` seems to be a _server-rendered DOM element_ while `vnode` is a _virtual DOM node_. `Elm` is printed as HTML so you can figure out where the error happened.
